/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._190;

import java.math.BigInteger;

/**
 * 示例 1：
 *
 * 输入: 00000010100101000001111010011100
 * 输出: 00111001011110000010100101000000
 * 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596，
 *       因此返回 964176192，其二进制表示形式为 00111001011110000010100101000000。
 * 示例 2：
 *
 * 输入：11111111111111111111111111111101
 * 输出：10111111111111111111111111111111
 * 解释：输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293，
 *       因此返回 3221225471 其二进制表示形式为 10101111110010110010011101101001。
 *
 * 在 Java 中，编译器使用二进制补码记法来表示有符号整数。
 * 因此，在上面的 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._190
 * @ClassName: ReverseBits
 * @Author: linyaonan
 * @Date: 2019/11/20 15:38
 */
public class ReverseBits {

    public int reverseBits(int n) {
        String s1 = Integer.toBinaryString(n);
        char[] chars = s1.toCharArray();
        StringBuilder builder = new StringBuilder();
        for (int i = chars.length - 1; i >= 0; i--) {
            builder.append(chars[i]);
        }
        String s = builder.toString();
        int ten = Integer.parseInt(s, 2);
        return ten;

    }

    public int reverseBitsNew(int n) {
        int result = 0;
        for (int i = 0; i <= 32; i++) {
            // 1. 将给定的二进制数,由低到高位逐个取出
            // 1.1 右移 i 位,
            int tmp = n >> i;
            // 1.2  取有效位
            tmp = tmp & 1;
            // 2. 然后通过位运算将其放置到反转后的位置.
            tmp = tmp << (31 - i);
            // 3. 将上述结果再次通过运算结合到一起
            result |= tmp;
        }
        return result;
    }

    /**
     * 二进制转十进制
     * @param bit
     * @return
     */
    private int getTenFromBit(String bit) {
        BigInteger bigInteger = new BigInteger(bit, 2);
        return bigInteger.intValue();
    }

    /**
     * 十进制转二进制
     * @param ten
     * @return
     */
    private String getBitFromTen(String ten) {
        BigInteger bigInteger = new BigInteger(ten);
        if (bigInteger.compareTo(BigInteger.ZERO) < 0) {
            return getFuBit(bigInteger);
        } else {
            String s = bigInteger.toString(2);
            if (s.length() < 32) {
                int add = 32 - s.length();
                StringBuffer buffer = new StringBuffer();
                for (int i = add; i > 0; i--) {
                    buffer.append("0");
                }
                buffer.append(s);
                s = buffer.toString();
            }
            return s;
        }
    }

    /**
     * 负数转32位二进制
     *
     * -3 ->  00000000000000000000000000000010 (2) ->  11111111111111111111111111111101(-3)
     *
     * @param v
     * @return
     */
    private String getFuBit(BigInteger v) {
        // 补码前
        String s = v.negate().subtract(BigInteger.ONE).toString(2);
        char[] chars = s.toCharArray();
        StringBuffer buffer = new StringBuffer();
        for (int i = 32 - chars.length; i > 0; i--) {
            buffer.append("1");
        }
        for (char aChar : chars) {
           if (aChar == '0') {
               buffer.append("1");
           } else {
               buffer.append("0");
           }
        }
        return buffer.toString();
    }

}
